package member;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class UserMemberSearchServlet extends HttpServlet {

	static String id;
	static Connection connection=null;
	static Statement statement=null;
	static ResultSet resultSet=null;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//UTF8でエンコーディング
		request.setCharacterEncoding("UTF-8");

		//	問い合わせ文字列を取得
		String pageUrl = request.getQueryString();
		int index = pageUrl.indexOf("&page=");

		//	検索画面より表示、または、頁番号リンクで表示した場合
		if (index >= 0) {
			//	全てのパラメータを取得
			@SuppressWarnings("unchecked")
			Map<String, String[]> pMap = (Map<String, String[]>)request.getParameterMap();

			//	別のマップへコピー
			Map<String, String[]> m = new HashMap<String, String[]>();
			m.putAll(pMap);

			//	ページ番号より前の問い合わせ文字列を保存
			pageUrl = pageUrl.substring(0, index);
			String[] v = { pageUrl };
			m.put("url",  v  );

			//	ページ番号を保存
			String page = request.getParameter("page");
			String[] p = { page };
			m.put("page", p);

			//	全てのパラメータをセッションに保存
			HttpSession session = request.getSession();
			session.removeAttribute("MemberSerchParameter");
			session.setAttribute("MemberSerchParameter", m);
		}
		//	検索する
		search(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");

		//	検索する
		search(req, resp);
	}

	private void search(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
		//利用者情報情報
		String user_id 	= null;
		String name 		= null;
		String ruby	 	= null;
		String msg 		= null;
		String pageStr 	= null;

		//	セッション情報からパラメータを取得
		HttpSession session = request.getSession();
		@SuppressWarnings("unchecked")
		Map<String, String[]> m = (Map<String, String[]>)session.getAttribute("MemberSerchParameter");

		String[] user_ids 	= (String[])m.get("user_id");
		String[] names 		= (String[])m.get("name");
		String[] rubys 		= (String[])m.get("ruby");
		String[] pages 		= (String[])m.get("page");

		user_id 	= user_ids[0];
		name 	= names[0];
		ruby 		= rubys[0];
		pageStr = pages[0];

		StringBuffer cond = new StringBuffer( " where  delete_flag =0 and ( " );

		String nameQ = " name like '%" + name + "%'";

		if(name != null && name.length()>0){
			cond.append(nameQ) ;
		}
		else {
			cond.append(nameQ);
		}

		if(ruby != null && ruby.length()>0){
			cond.append("and  ruby like '%" + ruby + "%'") ;
		}
		else {
			cond.append(" and 1 ");
		}

		if(user_id != null && user_id.length()>0){
			cond.append(" and user_id like '%" + user_id + "%'") ;
		}
		else {
			cond.append(" and 1 ");
		}
		cond.append(" ) ");

		String sql = " SELECT * FROM members ";								//	利用者情報SQL
		String sqlCnt = " select count(*) as cnt from members" ;			//	カウントSQL

		Connection con = null;
		Statement smt = null;
		String path = null;

		try{
			con = common.DBManager.getConnection();
			smt = con.createStatement();

			ResultSet rsCnt = smt.executeQuery(sqlCnt + cond);

			int cnt = 0;		//	検索結果件数
			if(rsCnt.next()){
				cnt = rsCnt.getInt("cnt");
			}

			int max = MemberBean.PAGE_MAX;	// 1ページあたりの表示件数

			//	登録後は頁番号＝999999
			if ("999999".equals(pageStr)) {
				double dMax = cnt / (double)max;
				int maxPage = (int)Math.ceil(dMax);
				pageStr = String.valueOf(maxPage);
			}
			//	検索結果の取得範囲（Ｌｉｍｉｔ）を準備
			int page = 0;
			if(pageStr == null) {
				page = 1;
			} else {
				page = Integer.parseInt(pageStr);
			}
			int start = (page - 1) * max;

			//ページング用の1ページ表示上限条件
			String limit = " order by id limit " + start + "," + max ;

			ResultSet rs = smt.executeQuery(sql + cond + limit);
			List<MemberBean> list = new ArrayList<MemberBean>();

			//該当する情報がない場合に検索結果画面に表示するエラーメッセージ
			//MemberBeanをから取得
			String  rmsg = MemberBean.ERR_MSG;

			while(rs.next()){
				msg = "";
				rmsg="";

				MemberBean mb = new MemberBean();

				mb.setId(rs.getInt("id"));
				mb.setUserId(rs.getString("user_id"));
				mb.setName(rs.getString("name"));
				mb.setRuby(rs.getString("ruby"));

				list.add(mb);
			}

			//JSPへ表示する検索結果件数
			String cntmsg = ("該当した利用者は"+ cnt+"名です");

			//SQL文をコンソールへ表示
			System.out.println(list.size());

			if(cnt == 0){
				path = "userMemberSearch.jsp";

				request.setAttribute("rmsg", rmsg);
			}else{
				request.setAttribute("list", list);
				request.setAttribute("cntmsg", cntmsg);
				request.setAttribute("cnt", cnt);
				request.setAttribute("page", page);

				path = "userMemberSearchResult.jsp";
			}
		}
		catch(SQLException e) {
			throw new ServletException(e);
		}
		finally {
			if(smt != null){
				try{smt.close();}catch(SQLException ignore){}
			}
			if(con != null){
				try{con.close();}catch(SQLException ignoew){}
			}
		}
		//情報をJSPに渡して表示
		request.getRequestDispatcher(path)
			.forward(request, response);
	}
}
